package threadsAssign3;
import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;
public class SimulatorFrame extends JFrame{
private static final long serialVersionUID = -3737453827491103543L;
private JPanel frame = new JPanel(new GridLayout(2, 1, 10, 10));
private JPanel controls = new JPanel(new GridLayout(4, 4));
private Button startButton = new Button("Start simulation");
//minimum arrival interval between clients
private JLabel minimumArrivalIntervalLabel = new JLabel("Minimum arrival interval:");
private JTextField minimumArrivalInterval = new JTextField();
//maximum arrival interval between clients
private JLabel maximumArrivalIntervalLabel = new JLabel("Maximum arrival interval:");
private JTextField maximumArrivalInterval = new JTextField();
private JLabel minimumServiceTimeLabel = new JLabel("Minimum service time:");
private JTextField minimumServiceTime = new JTextField();
private JLabel maximumServiceTimeLabel = new JLabel("Maximum service time:");
private JTextField maximumServiceTime = new JTextField();
private JLabel nrOfServersLabel = new JLabel("Nr of servers:");
private JTextField nrOfServers = new JTextField();
private JLabel thresholdLabel = new JLabel("Threshold:");
private JTextField threshold = new JTextField();
private JLabel simulationTimeLabel = new JLabel("Simulation time:");
private JTextField simulationTime = new JTextField();
private JTextField communication = new JTextField("");
private JPanel simulatorFrame = new JPanel(new GridLayout(2, 5, 10, 10));
private Thread thread;
private static final int WIDOW_WIDTH = 600;
private static final int WINDOW_HEIGHT = 600;
public SimulatorFrame() {
setSize(WIDOW_WIDTH, WINDOW_HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setControls();
frame.add(controls);
frame.add(simulatorFrame);
add(frame);
setVisible(true);
}
private void setControls() {
controls.setMaximumSize(new Dimension(600, 100));
addFields();
startButtonActions();
controls.add(startButton);
controls.add(communication);
}
private void addFields() {
controls.add(minimumArrivalIntervalLabel);
controls.add(minimumArrivalInterval);
controls.add(maximumArrivalIntervalLabel);
controls.add(maximumArrivalInterval);
controls.add(minimumServiceTimeLabel);
controls.add(minimumServiceTime);
controls.add(maximumServiceTimeLabel);
controls.add(maximumServiceTime);
controls.add(nrOfServersLabel);
controls.add(nrOfServers);
controls.add(thresholdLabel);
controls.add(threshold);
controls.add(simulationTimeLabel);
controls.add(simulationTime);
}
@SuppressWarnings("deprecation")
private void startButtonActions() {
startButton.addActionListener(e -> {
if (thread != null) {
thread.stop();
EventsLog.log("Simulation halted");
EventsLog.close();
Simulator.resetParameters();
}
try {
setSimulationParameters();
} catch (Exception exception) {
communication.setText("The fields should have integer values");
return;
}
EventsLog.initialize();
Simulator.setScheduler(new Scheduler());
Simulator simulator = new Simulator();
thread = new Thread(simulator);
thread.start();
});
}
private void setSimulationParameters() throws Exception {
if (!minimumArrivalInterval.getText().isEmpty())
Simulator.setMinArrivalInterval(toInt(minimumArrivalInterval.getText()));
if (!maximumArrivalInterval.getText().isEmpty())
Simulator.setMaxArrivalInterval(toInt(maximumArrivalInterval.getText()));
if (!minimumServiceTime.getText().isEmpty())
Simulator.setMinProcessTime(toInt(minimumServiceTime.getText()));
if (!maximumServiceTime.getText().isEmpty())
Simulator.setMaxProcessTime(toInt(maximumServiceTime.getText()));
if (!nrOfServers.getText().isEmpty())
Simulator.setMaxNrOfServers(toInt(nrOfServers.getText()));
if (!threshold.getText().isEmpty())
Simulator.setThreshold(toInt(threshold.getText()));
if (!simulationTime.getText().isEmpty())
Simulator.setFinishTime(toInt(simulationTime.getText()));
}
private static int toInt(String string) throws Exception {
return Integer.parseInt(string);
}
public void showReports(float averageWaitingTime, float serviceTime, int peakHour) {
communication.setText(String.format("Average waiting time: %f; Service time: %f; Peak hour: %d",
averageWaitingTime, serviceTime, peakHour));
}
public void showCurrentTime() {
communication.setText(String.format("%d", Simulator.getCurrentTime()));
}
public void displayData(ArrayList<String[]> tasksOnServers) {
simulatorFrame.removeAll();
simulatorFrame.revalidate();
for (String[] tasks : tasksOnServers) {
simulatorFrame.add(new JList<>(tasks));
}
simulatorFrame.repaint();
simulatorFrame.revalidate();
}
}